/**
 * 
 * @param {*} obj 数据
 * @returns type
 */
const type = obj => Object.prototype.toString.call(obj).match(/^\[\w+ (\w+)\]$/)[1]

// 规则校验函数
/**
 * 
 * @param {*} data  校验数据源
 * @param {*} rules 校验规则
 * @returns Object
 */
const verify = (data, rules) => {
    // 取出每一个字段的校验规则
    for (const key in rules) {
        let ruleItem = rules[key]
        // 不是数组跳出当前循环
        if (type(ruleItem) != 'Array') continue;
        // 取出字段下所有的校验规则
        for (let i = 0; i < ruleItem.length; i++) {
            // 校验规则详情
            const ruleDetail = ruleItem[i];
            let rule = null
            if (ruleDetail['validator'] && !ruleDetail['validator'](data, ruleDetail)) rule = 'validator' // 自定义函数校验
            // 判断必填问题
            else if (ruleDetail['required'] && (data[key] == undefined || data[key] == null || data[key] == '')) rule = 'required' // 必填校验
            else if (data[key] != null && data[key] != undefined && data[key] != '') {
                if (ruleDetail['min'] && data[key].length < ruleDetail['min']) rule = 'min' // 最小长度
                else if (ruleDetail['max'] && data[key].length > ruleDetail['max']) rule = 'max' // 最大长度
                else if (ruleDetail['type'] && type(data[key]).toLocaleLowerCase() != ruleDetail['type'].toLocaleLowerCase()) rule = 'type' // 数据类型校验
                else if (ruleDetail['regexp'] && !ruleDetail['regexp'].test(data[key])) rule = 'regexp' // 正则校验
            }
            // 如果有未通过的
            if (rule) return {
                key, // 错误的key
                rule, // 触发验证的字段
                ruleDetail // 验证规则源
            }
        }
    }
    return false
}
/**
 * ========================================TEST==========================
 */
// (() => {
//     let rules = {
//         name: [
//             { required: true, message: '请输入活动名称', trigger: 'blur' },
//             { min: 3, max: 5, message: '长度在 3 到 5 个字符', trigger: 'blur' },
//             { type: 'NUMBER', message: '类型为数字', trigger: 'blur' }
//         ],
//         date1: [
//             { type: 'date', message: '格式为日期', trigger: 'change' }
//         ],
//         phone: [
//             { required: true, message: '请输入手机号' },
//             { regexp: /^1[1-9]{2}\d{8}$/, message: '请输入正确手机号' },
//         ],
//         password: [
//             { required: true, message: '请输入密码' },
//         ],
//         oldpassword: [
//             { required: true, message: '请再次输入密码' },
//             {
//                 validator: (data, rule) => {
//                     if (data.password != data.oldpassword) return false
//                     return true
//                 }, message: '两次密码不一致'
//             },
//         ],
//     }
//     let obj = {
//         name: 122,
//         date1: new Date(),
//         phone: '17768938295',
//         password: '123',
//         oldpassword: '123',
//     }
//     let flag = verify(obj, rules)
//     if (flag) {
//         console.log(flag.ruleDetail.message);
//     } else {
//         console.log('验证通过');
//     }
// })()
